#include "adc_drv.h"


#if USE_ADC_0
static uint16_t ADC0ConvertResultArr[ADC0_RESULT_DATA_ARR_LEN_MAX] = { 0 };

/**
 * @desc  : 多通道 dma配置
 * @date  : 2024-11-29
 * @author: AnRui
 */
static void ADC0DmaInit(void) {

    /* 使能DMA时钟；*/
    rcu_periph_clock_enable(RCU_DMA0);
    /* 复位DMA通道；*/
    dma_deinit(DMA0, DMA_CH0);
    dma_parameter_struct dmaStruct;
    dma_struct_para_init(&dmaStruct);
    /* 配置传输方向；*/
    dmaStruct.direction = DMA_PERIPHERAL_TO_MEMORY;
    /* 配置数据源地址；*/
    dmaStruct.periph_addr = (uint32_t)(&ADC_RDATA(ADC0));
    /* 配置源地址是固定的还是增长的；*/
    dmaStruct.periph_inc = DMA_PERIPH_INCREASE_DISABLE;
    /* 配置源数据传输位宽；*/
    dmaStruct.periph_width = DMA_PERIPHERAL_WIDTH_16BIT;
    /* 配置数据目的地址；*/
    dmaStruct.memory_addr = (uint32_t)ADC0ConvertResultArr;
    /* 配置目的地址是固定的还是增长的；*/
    dmaStruct.memory_inc = DMA_MEMORY_INCREASE_ENABLE;
    /* 配置目的数据传输位宽；*/
    dmaStruct.memory_width = DMA_MEMORY_WIDTH_16BIT;
    /* 配置数据传输最大次数；*/
    dmaStruct.number = ADC0_RESULT_DATA_ARR_LEN_MAX;
    /* 配置DMA通道优先级；*/
    dmaStruct.priority = DMA_PRIORITY_HIGH;
    dma_init(DMA0, DMA_CH0, &dmaStruct);
    /* 使能DMA循环模式搬移数据；*/
    dma_circulation_enable(DMA0, DMA_CH0);
    /* 使能DMA通道；*/
    dma_channel_enable(DMA0, DMA_CH0);

}

/**
 * @desc  : ADC0初始化配置
 * @date  : 2024-11-27
 * @author: AnRui
 */
static void ADC0Init(void) {
    /* 使能时钟；*/
    rcu_periph_clock_enable(RCU_ADC0);
    /*重置adc*/
    adc_deinit(ADC0);
    /* 设置分频系数；*/
    rcu_adc_clock_config(ADC0_CLOCK_DIV);
    /* 设置独立模式；*/
    adc_mode_config(ADC_MODE_FREE);
    /* 设置分辨率 12位 4095*/
    adc_resolution_config(ADC0, ADC_RESOLUTION_12B);
    /* 设置连续模式；*/
    adc_special_function_config(ADC0, ADC_CONTINUOUS_MODE, DISABLE);
    /* 设置扫描模式；*/
    adc_special_function_config(ADC0, ADC_SCAN_MODE, ENABLE);
    /* 设置数据对齐；*/
    adc_data_alignment_config(ADC0, ADC_DATAALIGN_RIGHT);
    /* 设置数据对齐；*/
    ADC_CHANNEL_CONFIG();
    /* 设置选择哪一个外部触发源: 软件触发*/
    adc_external_trigger_source_config(ADC0, ADC_REGULAR_CHANNEL, ADC0_1_2_EXTTRIG_REGULAR_NONE);
    /* 使能外部触发；*/
    adc_external_trigger_config(ADC0, ADC_REGULAR_CHANNEL, ENABLE);
    /* 使能ADC的DMA功能；*/
    adc_dma_mode_enable(ADC0);
    /* 使能ADC；*/
    adc_enable(ADC0);
    /* 内部校准；*/
    DelayNus(50);
    adc_calibration_enable(ADC0);
}

/**
 * @desc  : ADC0初始化
 * @date  : 2025-04-07
 * @author: AnRui
 * @note  : DMA初始化在adc初始化之前
 */
void ADC0DrvInit(void) {
    ADC0_GPIO_CONFIG();
    ADC0DmaInit();
    ADC0Init();
    /* 触发一次*/
    adc_software_trigger_enable(ADC0, ADC_REGULAR_CHANNEL);
}


/**
 * @desc  : 触发adc常规通道转换
 * @date  : 2025-02-25
 * @author: AnRui
 * @note  :
 */
void ADC0RoutineTrigger(void) {
    // 触发常规通道转换
    adc_software_trigger_enable(ADC0, ADC_REGULAR_CHANNEL);
}

/**
 * @desc  : 触发adc注入通道转换
 * @date  : 2025-02-25
 * @author: AnRui
 * @note  :
 */
void ADC0InsertTrigger(void) {
    // 触发注入通道转换
    adc_software_trigger_enable(ADC0, ADC_INSERTED_CHANNEL);
}



/**
 *  @desc  :获取注入规则通道数据
 * @date  : 2025-02-25
 * @author: AnRui
 * @param :  inserted_channel - {参数说明}:
 * @return: uint16_t
 * @note  :注入通道取值: ADC_INSERTED_CHANNEL_0|ADC_INSERTED_CHANNEL_1|ADC_INSERTED_CHANNEL_2|ADC_INSERTED_CHANNEL_3
 */
uint16_t  GetADC0InsertChannelResult(uint8_t inserted_channel) {
    return adc_inserted_data_read(ADC0, inserted_channel);
}


/**
 * @desc  : 获取保存adc0常规通道的结果的数组指针
 * @date  : 2025-04-07
 * @author: AnRui
 * @return: uint16_t*
 * @note  :
 */
uint16_t* GetADC0RoutineChannelResultArrPointer(void) {
    return ADC0ConvertResultArr;
}


#endif
